import {
    EntityTypeEnum, ExpTypeEnum, InputTypeEnum, EnemySkillTypeEnum, StateTypeEnum, LevelTypeEnum
} from "../common/Enum";

/** 角色属性 */
export interface IAttr {
    /** 生命 */
    hpMax: number,
    /** 防御值 */
    defense: number,
    /** 伤害 */
    damage: number,
    /** 成长 获取经验百分比 */
    growth: number,
    /** 恢复 */
    regeneration: number,
    /** 击退 */
    knckback: number,
    /** 射程 */
    range: number,
    /** 射击速度 */
    fireRate: number,
    /** 拾取范围百分比 */
    lootRange: number,
    /** 暴击伤害倍率 */
    critRate: number,
    /** 暴击概率 */
    critChance: number,
    /** 移动速度 */
    moveSpeed: number,
    /** 生命比 */
    hpMaxRate: number,
    /** 防御值比 */
    defenseRate: number,
    /** 伤害比 */
    damageRate: number,
    /** 可携带武器数量 */
    weaponNumber: number,
    /** 可携带道具数量 */
    propNumber: number,
    /** 贯穿 */
    penetrate: number,
    /** 开具经验球数量 */
    startExp: number,
    /** 重生 */
    rebornNum: number,
}

/** 武器属性 */
export interface IWeaponAttr {
    aimRadiu: number,
    shootRadiu: number,
    critChance: number,
    critRate: number,
    damage: number,
    shootCD: number,
    penetrate: number,
    special?: number,
}

/** 经验球 */
export interface IExp {
    id: number,
    type: ExpTypeEnum,
    pos: IVec2,
    state: StateTypeEnum,
}

/** 科技卷轴 */
export interface IScroll {
    id: number,
    pos: IVec2,
    state: StateTypeEnum,
}

/** 怪物技能 */
export interface IEnemySkill {
    id: number,
    owner: number,
    type: EnemySkillTypeEnum,
    CD: number,
    /** 蓄力时间 */
    castingTime: number,
    /** 攻击的坐标,或方向 */
    attackPos?: IVec2 | null,
    state?: StateTypeEnum,
    /** 持续时间，比如冲锋的持续时间 */
    during: number,
}

/** 角色 */
export interface IActor {
    id: number,
    hp: number,
    skill: number[],
    nickName: string,
    type: EntityTypeEnum,
    position: IVec2,
    direction: IVec2,
    state: StateTypeEnum,
    attr: IAttr,
    /** 技能点 */
    skillPoint: number,
    /** 受击间隔 */
    beHitCD: number,
    /** 再生间隔 */
    regenerationCD: number,
    /** 上一帧是否移动了 */
    isMove: 0 | 1,
    /** 死亡次数 */
    deadNum: 0,
}

/** 怪物 */
export interface IEnemy {
    id: number,
    agentId: number,
    type: EntityTypeEnum,
    position: IVec2,
    direction: IVec2,
    hp: number,
    hpMax: number,
    aliveTime: number,
    state: StateTypeEnum,
    /** 是否受到攻击 */
    isBeHit: 0 | 1,
    shootCD?: number,
    impactCD?: number,
    /** 目标点，用于随即移动 */
    targetPos?: IVec2,
    /** 攻击的目标点，用于冲锋 */
    attackPos?: IVec2,
    standCastingTime?: number,
    during?: number,
    /** 吸收子弹 */
    absorbBullet?: number,
    /** 恢复的生命 */
    recoverHP?: number,
    partId: number
}

/** 子弹 */
export interface IBullte {
    id: number,
    /** 所属玩家 */
    owner: number,
    /** 所属武器 */
    ownerWeapon: number,
    aliveTime: number,

    position: IVec2,
    direction: IVec2,
    state: StateTypeEnum,

    type: EntityTypeEnum,
    /** 贯穿*/
    penetrate: number,
    /** 爆率 */
    critChance: number,
    /** 爆伤 */
    critRate: number,

    /** 不会重复命中id */
    filterId: number[],
    damage: number,
}

/** 武器 */
export interface IWeapon {
    id: number,
    /** 所属玩家 */
    owner: number,
    entityType: EntityTypeEnum,

    position: IVec2,
    direction: IVec2,

    shootCD: number,
    searchCD: number,
    targetId: number,
    state: StateTypeEnum,

    star: number,
}

export interface ISkill {
    entityType: number,
    data?: any,
}

/** 道具 */
export interface IProp {
    id: number,
    owner: number,
    entityType: EntityTypeEnum,
    star: number,
}

/** 总状态 */
export interface IState {
    actors: IActor[],
    bullets: IBullte[],
    enemyBullets: IBullte[],
    nextId: number,
    enemies: IEnemy[],
    weapons: IWeapon[],
    skill: { [key: number]: ISkill },
    enemyBuffs: [],
    props: IProp[],
    /** 怪物的技能 */
    enemySkills: IEnemySkill[],
    exps: IExp[],
    scrolls: IScroll[],
    /** 该局游戏获得的科技卷轴 */
    scrollNum: number,
    redXs: IRedX[],
    /** 该帧时间 */
    dt: number,
    /** 随机数种子 */
    seed: number,
    /** 关卡状态 */
    levelState: {
        /** 总时间 */
        totalTime: number,
        /** 非boss关卡时间 */
        normalLevelTime: number,
        /** 总关卡数 */
        totalLevel: number,
        /** 该关时间 */
        levelTime?: number,
        /** 关卡怪物批次计时 */
        partEnemyTime: Record<string, {
            /** 第一波出怪延迟 */
            time: number,
            /** 怪物出现数量 */
            number: number
        }>,
        /** boss组 */
        bossArr?: number[],
        /** 第几难度 */
        chapter: number,
        /** 第几关 */
        level: number,
        /** 关卡类型 */
        levelType: LevelTypeEnum,
    }

    /** 是否暂停 */
    isPause: 0 | 1,
    /** 游戏倍速 */
    gameSpeed: 0.5 | 1 | 2 | 3 | 4,
    /** 玩家经验值 */
    playerExp: number,
    /** 玩家等级 */
    playerLevel: number,
    /** 游戏状态 */
    state: StateTypeEnum,
}

/** 出怪预警红叉 */
export interface IRedX {
    id: number,
    state: StateTypeEnum,
    position: IVec2,
    time: number,
    enemyType: EntityTypeEnum,
    hpRatio: number,
    partId: number,
}

export interface IVec2 {
    x: number,
    y: number,
}

export interface IRect {
    x: number,
    y: number,
    width: number,
    height: number,
}

export type IClientInput = IActorMove | ITimePass

export interface IActorMove {
    type: InputTypeEnum,
    id: number,
    dt: number,
    direction: IVec2
}

export interface ITimePass {
    type: InputTypeEnum,
    seed: number,
    dt: number,
    totalTime: number,
}

export interface IBuff {
    owner: number,
    id: number,
    type: number,
    duration: number,
}

/** 游戏数据 */
export interface IGameData {
    /** 科技卷轴数量 */
    scroll: number,
}